home *** CD-ROM | disk | FTP | other *** search
/ NOVA - For the NeXT Workstation / NOVA - For the NeXT Workstation.iso / SourceCode / TextORama / TurboTextField.m < prev    next >
Text File  |  1992-12-19  |  3KB  |  121 lines

  1. /* TurboTextField.m
  2.  *
  3.  *   TurboTextField is a subclass of TextField which installs
  4.  * the TurboTFCell class as it's Cell class.  It also overrides
  5.  * textDidGetKeys:isEmpty: in order to support "length watching"
  6.  * and the ability to restore the previous text after a paste has
  7.  * failed because it is too long.
  8.  * 
  9.  *
  10.  * You may freely copy, distribute, and reuse the code in this example.
  11.  * NeXT disclaims any warranty of any kind, expressed or  implied, as to its
  12.  * fitness for any particular use.
  13.  *
  14.  * Written by:  Sharon Zakhour 
  15.  * Created:  Oct/91
  16.  */
  17.  
  18. #import "TurboTextField.h"
  19. #import "TurboTFCell.h"
  20. #include <appkit/Text.h>
  21. #import <appkit/Application.h>
  22. #import <appkit/Panel.h>
  23. #import <dpsclient/dpsclient.h>
  24. #import <appkit/nextstd.h>
  25. #import <strings.h> 
  26. #import <appkit/publicWraps.h>
  27.  
  28. @implementation TurboTextField
  29.  
  30. + initialize
  31. {
  32.     if (self == [TurboTextField class])
  33.     {
  34.     [super initialize];
  35.     [TurboTextField setCellClass:[TurboTFCell class]];
  36.     }
  37.     return self;
  38. }
  39.  
  40. - setMaxLength: (int) length
  41. {
  42.     return [cell setMaxLength: length];
  43. }
  44.  
  45. - setAutoJump: (BOOL) flag forLength: (int)length
  46. {
  47.     return [cell setAutoJump: flag forLength: length];
  48. }
  49.  
  50. - setAcceptsReturn: (BOOL) flag
  51. {
  52.     return [cell setAcceptsReturn: flag];
  53. }
  54.  
  55. - setCustomFilter: (NXTextFilterFunc)aFilter
  56. {
  57.     return [cell setCustomFilter: aFilter];
  58. }
  59.  
  60. #define TOO_LONG        1
  61. #define ILLEGAL_STRING    2
  62.  
  63. - textDidGetKeys:sender isEmpty:(BOOL)flag
  64. {
  65.     int oldLen, error = 0;
  66.     char     *temp;
  67.     
  68.     if (!flag)
  69.     {
  70.     temp = malloc([cell maxLength] + 1);
  71.     [sender getSubstring:temp start:0 length:[cell maxLength]];
  72.     temp[[cell maxLength]] = '\0';
  73.  
  74.     // First check to see if the string is too long.  This will only
  75.     // occur when pasting since the text and character filters
  76.     // handle keyboard entry.
  77.     if ([cell maxLength] && [sender textLength] > [cell maxLength])
  78.     {
  79.         error = TOO_LONG;
  80.     }
  81.     
  82.     // Next, run this text through the filter.  This will
  83.     // catch any illegally formatted paste.
  84.     if ([cell checkString: temp] == NO)
  85.     {
  86.         error = ILLEGAL_STRING;
  87.     }
  88.  
  89.     switch (error)
  90.     {
  91.     case 0:
  92.         // No error -- so save current input text and return
  93.         [cell setOriginalText: temp];
  94.         return self;
  95.     case TOO_LONG:
  96.         NXBeep();
  97.         NXRunAlertPanel (NULL,  "String too long...","OK", NULL, NULL);
  98.         break;
  99.     case ILLEGAL_STRING:
  100.         NXBeep();
  101.         NXRunAlertPanel (NULL,  "Illegally formatted string...","OK", NULL, NULL);
  102.         break;
  103.     }
  104.     
  105.     // Now replace the original text (because an error was encountered)
  106.     [sender setSel: 0 : [sender textLength]];
  107.     oldLen = strlen([cell originalText]);
  108.     if (oldLen)
  109.         [sender replaceSel : [cell originalText]];
  110.     else
  111.         [sender replaceSel: ""];
  112.     [sender setSel: oldLen: oldLen];
  113.     }
  114.     
  115.     // If a delegate has been installed, let it have a crack at this...
  116.     [super textDidGetKeys: sender isEmpty: flag];
  117.     return self;
  118. }
  119.  
  120. @end
  121.